/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package util.www.sql;

import java.sql.SQLException;
import util.usuario.seguridad.PermisosTabla;
import java.util.ArrayList;
import java.util.List;
import util.www.sql.domain.Valor;

/**
 *
 * @author Rdelacruz
 */
public class SentenciaSql {
    private final PermisosTabla permisos;
    
    private final TipoSentenciaSql tipo;
    //private final String nombreTabla;
    private final List<Valor> valores = new ArrayList<Valor>();
    protected final RegistroSql registro;
    
    //private final String whereClaveSql;
    
    private String whereUpdateSql;
    
    
    public SentenciaSql(TipoSentenciaSql tipo, RegistroSql registro) throws SQLException {
        this(tipo,registro,null);
    }
    
    public SentenciaSql(TipoSentenciaSql tipo,RegistroSql registro, PermisosTabla permisos) throws SQLException {
        this.permisos = permisos;
        this.tipo = tipo;
        //this.nombreTabla = nombreTabla;
        this.registro = registro;
        
        /*
        //this.whereClaveSql
        WhereSqlEstatico w = new WhereSqlEstatico();
        for(Valor v: registro.valoresClave) {
            w.agregar(v.getColumna(),valor(v), false);
        }
        whereClaveSql = w.getAnd();
        */
        
        //this.valores
        if(tipo==TipoSentenciaSql.INSERT) {
            for(Valor v : registro.valoresClave) {
                agregarValor(tipo,v);
            }
        }
        
        for(Valor v : registro.valores) {
            agregarValor(tipo,v);
        }
    }
    
    public boolean tieneValores() {
        //return !valores.isEmpty();
        return !registro.valoresClave.isEmpty() || !registro.valores.isEmpty();
    }   
 
            
    protected void agregarValor(final TipoSentenciaSql tipo, final Valor v) {
        boolean agregar = false;
        
        if(permisos==null) {           
            agregar = true;
        }
        else {
            switch(tipo) {
                case INSERT:
                    agregar = permisos.puedeInsertar(v.getColumna(),v.getValor());
                break;
                case UPDATE:
                    agregar = permisos.puedeActualizar(v.getColumna(),v.getValor());
                break;    
            }
        }
        
        if(agregar) {
            this.valores.add(v);
        }
    }        
    
    protected String valor(Valor v) {
        if(v==null)
            return "null";      
        return v.getValorSql();
    }
    
    public String getSql() throws SQLException {
        switch(tipo) {
            case INSERT:
                return getInsertSql();
            case UPDATE:
                String sql = whereUpdateSql==null? registro.getWhereClaveSql() : whereUpdateSql;
                return getUpdateSql(sql);
        }
        return null;
    }
     
    private String getInsertSql() {                
        if(!valores.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            sb.append("insert into ");
            sb.append(registro.getNombreTabla());
            
            sb.append("(");
            for(Valor v : valores) {         
                sb.append(v.getColumna());
                sb.append(",");                
            }
            sb.deleteCharAt(sb.length()-1);//borrando la ultima coma
            
            sb.append(") values (");                        
            
            for(Valor v : valores) {
                sb.append(valor(v));
                sb.append(",");
            }
            
            sb.deleteCharAt(sb.length()-1);//borrando la ultima coma
            sb.append(")");
            
            return sb.toString();
        }        
        return "";
    }   
    
    private String getUpdateSql(String where) {
        if(!valores.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            sb.append("update ");
            sb.append(registro.getNombreTabla());
            
            sb.append(" set ");
            for(Valor v : valores) {         
                sb.append(v.getColumna());
                sb.append("=");                
                sb.append(this.valor(v));
                sb.append(",");                
            }
            sb.deleteCharAt(sb.length()-1);//borrando la ultima coma
            
            sb.append(" ");
            sb.append(where);                        
            
            return sb.toString();
        }        
        return "";
    }  
    
           
    protected final List<Valor> getValores() {
        return valores;
    }  

    public String getWhereUpdateSql() {
        return whereUpdateSql;
    }

    public void setWhereUpdateSql(String whereUpdateSql) {
        this.whereUpdateSql = whereUpdateSql;
    }
    
    
    
}
